use crate::tool::{Tool, ToolResult};  // 只导入需要的类型，移除无用的 ToolCall
use std::collections::HashMap;

pub struct CalculatorTool;

impl Tool for CalculatorTool {
    fn name(&self) -> &str {
        "calculator"
    }

    // 修正返回值为 Result<ToolResult, String>
    fn run(&self, params: &HashMap<String, serde_json::Value>) -> Result<ToolResult, String> {
        // 解析参数（? 运算符现在可用，因为返回值是 Result）
        let a = params.get("a")
            .and_then(|v| v.as_f64())
            .ok_or("缺少参数a或格式错误")?;  // 错误会被 Result 捕获
        
        let b = params.get("b")
            .and_then(|v| v.as_f64())
            .ok_or("缺少参数b或格式错误")?;
        
        let op = params.get("op")
            .and_then(|v| v.as_str())
            .ok_or("缺少参数op或格式错误")?;

        // 执行计算
        let result = match op {
            "+" => a + b,
            "-" => a - b,
            "*" => a * b,
            "/" => if b == 0.0 {
                return Ok(ToolResult {  // 直接返回错误结果（无需 ?）
                    success: false,
                    content: "除数不能为0".to_string()
                });
            } else {
                a / b
            },
            _ => return Ok(ToolResult {
                success: false,
                content: format!("不支持的操作符: {}", op)
            }),
        };

        // 返回成功结果（无需 Ok 嵌套，直接返回 ToolResult 包裹在 Ok 中）
        Ok(ToolResult {
            success: true,
            content: format!("计算结果: {} {} {} = {}", a, op, b, result),
        })
    }
}